/**
 * 给定坐标平面的点，只能向对角线方向走一步，两点间的距离为需要走的步数，走不到距离则为零。
 * 现在给定N个点，求两两之间的距离之和。
 * 首先按照点的坐标和的奇偶性分为两类，不同类之间肯定走不到。
 * 然后只需考虑同类之中的点。本质上，从A点到B点需要在两个交叉方向分别走若干步即可，因此又可以分两个方向考虑
 * 将所有点向y=x方向投影，然后按照投影点进行排序，投影之间的距离就代表了某一个方向上的距离
 * 经过换算，只需要将 (x - y) / 2 就能表示该方向上的坐标，坐标差即为所需的步数
 * 排序以后，i点到其后所有点的该方向上的距离总和为 S[N] - S[i] - (N - i) * V[i]
 * 其中S为前缀和数组，N为本类中所有点的数量，V[i]为第i个点的投影坐标
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using pii = pair<int, int>;

int N;
vector<pii> A, B;

llt procVec(vector<llt> & vec){
    sort(vec.begin(), vec.end());
    vector<llt> sum(vec.size() + 1, 0);
    // vector<llt> d(vec.size() + 1, 0LL);
    for(int i=1,n=sum.size();i<n;++i) {
        sum[i] = sum[i - 1] + vec[i - 1];
        // d[i] = d[i - 1] + sum[i];
    }

    llt ans = 0;
    for(int i=1,n=sum.size();i<n;++i){
        auto m = n - i;
        ans += sum[n - 1] - sum[i - 1] - m * vec[i - 1];
    }
    return ans;
}

llt proc(const vector<pii> & vec){
    vector<llt> v;

    v.clear(); v.reserve(N);    
    for(const auto & p : vec){
        v.emplace_back(p.first + p.second >> 1);
    }    
    llt ans = procVec(v);

    v.clear(); v.reserve(N);
    for(const auto & p : vec){
        v.emplace_back(p.first - p.second >> 1);
    }
    llt tmp = procVec(v);

    return ans + tmp;
}

void work(){
    cin >> N;
    A.clear(); A.reserve(N);
    B.clear(); B.reserve(N);
    for(int x,y,i=0;i<N;++i){
        cin >> x >> y;
        if(x + y & 1){
            A.emplace_back(x, y + 1);
        }else{
            B.emplace_back(x, y);     
        }
    }
    cout << proc(A) + proc(B) << "\n";
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase; 
    while(nofkase--) work();
    return 0;
}
